package spring3.controller;

//import net.viralpatel.spring3.form.Contact;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import spring3.form.Usuario;
import spring3.form.UsuarioForm;
import spring3.form.Encriptacion;
import spring3.form.EncriptacionForm;
import spring3.form.Token;
import spring3.form.TokenForm;




import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import webservice.Servicio_scriptServiceStub.EncriptarResponse;
import webservice.Servicio_scriptServiceStub.RegistrarAdministradorResponse;

@Controller
@SessionAttributes
public class TextoController {

	/**
	 * Ingreso Login
	 * @return
	 */
	@RequestMapping("/login")
	public ModelAndView abrirPrincipal() {
		return new ModelAndView("login", "command", new Usuario());
	}

	// Loguearse, generar token para poder luego entrar al menu de servicios
	@RequestMapping("/loguear")
	public ModelAndView logearAdministrador(
			@ModelAttribute("Usuario") @Valid Usuario admin,
			BindingResult result, HttpSession session) {
		
		if (result.hasErrors()) {
			System.out.println("ERROR");
			return new ModelAndView("login");
		}
		try {
            webservice.Servicio_scriptServiceStub oStub =  new webservice.Servicio_scriptServiceStub();
			
			String username = admin.getUsuario();
			String pass =  admin.getPass();
			
			webservice.Servicio_scriptServiceStub.LoginAdministrador login = new webservice.Servicio_scriptServiceStub.LoginAdministrador();
            
            login.setUsuario(username);
            login.setClave(pass);
            
            webservice.Servicio_scriptServiceStub.LoginAdministradorResponse objResponse = oStub.loginAdministrador(login);
			
			String mensaje = objResponse.get_return();
			System.out.println("mensaje(token) --->"+mensaje);
			session.setAttribute("token", mensaje);
			
			
			if (mensaje.equals("Ingrese sus datos para loguearse")) {
				return new ModelAndView("mensaje", "message", mensaje);
			
			} else if (mensaje.equals("El largo de usuario no puede exceder de 20 caracteres")) {
				return new ModelAndView("mensaje", "message", mensaje);
				
			} else if (mensaje.equals( "La clave es incorrecta")) {
				return new ModelAndView("mensaje", "message", mensaje);	
			
			} else if (mensaje.equals( "La cuenta de usuario no existe")) {
				return new ModelAndView("mensaje", "message", mensaje);	
				
			}else{

				return new ModelAndView("menu", "command", "");
			}
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			return new ModelAndView("mensaje", "message", "ERROR");
		}
	}

	// Carga menues para los diferentes items

	/**
	 * Menu principal de servicios 
	 * @return
	 */
	@RequestMapping("/menu")
	public ModelAndView menu() {

		return new ModelAndView("menu");
	}

/**
 * Menu de administracion 
 * @return
 */
	// menu pricipal administrador
	@RequestMapping("/administracion")
	public ModelAndView administracion() {

		return new ModelAndView("administracion");
	}

	// menu para ingresar datos para administrador
	@RequestMapping("/agregarAdmin")
	public ModelAndView registrarAdmin() {

		return new ModelAndView("registrarAdmin", "command",
				new Usuario());
	}

	/**
	 * Registrar admin.
	 *
	 * @param administrador the administrador
	 * @param result the result
	 * @return the model and view
	 */
	@RequestMapping(value = "/registrarAdmin", method = RequestMethod.POST)
	public ModelAndView registrarAdmin(@ModelAttribute("administrador") @Valid Usuario administrador, BindingResult result,  HttpSession session) {

		String token = (String) session.getAttribute("token");

		if(token != null){
			try {

				if (result.hasErrors()) {
					System.out.println("ERROR");
					return new ModelAndView("menu");
				}

				webservice.Servicio_scriptServiceStub oStub = new webservice.Servicio_scriptServiceStub();

				
				webservice.Servicio_scriptServiceStub.ValidarLogin oValidarLogin = new webservice.Servicio_scriptServiceStub.ValidarLogin();
				
				oValidarLogin.setToken(token);

				webservice.Servicio_scriptServiceStub.ValidarLoginResponse loginResponse = oStub.validarLogin(oValidarLogin);
				String validaLogin = loginResponse.get_return();

				if(validaLogin.equals("Invalido")){
					System.out.println("Token invalido");
					return new ModelAndView("login", "command", new Usuario());
				}

				System.out.println("Token valido... por ahora!");
				webservice.Servicio_scriptServiceStub.RegistrarAdministrador oRegistrarAdministrador = new webservice.Servicio_scriptServiceStub.RegistrarAdministrador();
				
				oRegistrarAdministrador.setUsuario(administrador.getUsuario());
				oRegistrarAdministrador.setClave(administrador.getPass());

				RegistrarAdministradorResponse objResponse = oStub.registrarAdministrador(oRegistrarAdministrador);

				String mensaje = objResponse.get_return();

				System.out.println(mensaje);
				return new ModelAndView("mensaje", "message", mensaje);

			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();

				return new ModelAndView("mensaje", "message", "ERROR");
			}

		} else {
			return new ModelAndView("login", "command", new Usuario());
		}

	}

/**
 * Menu de registro de texto 
 * @return
 */
	// MENU PRINCIPAL TEXTO
	@RequestMapping("/textos")
	public ModelAndView textos() {

		return new ModelAndView("textos");
	}

	// MENU REGISTRAR TEXTO
	@RequestMapping("/ingresarTexto")
	public ModelAndView ingresarTexto() {

		return new ModelAndView("registrarTexto", "command", new Encriptacion());
	}

	// REGISTRAR TEXTO EN BD
		@RequestMapping(value = "/registrarTexto", method = RequestMethod.POST)
		public ModelAndView registrarTexto(
				@ModelAttribute("Administrador") @Valid Encriptacion texto,
				BindingResult result, HttpSession session) {
			
			String token = (String) session.getAttribute("token");
			
			// BindingResult result,
			if (result.hasErrors()) {
				System.out.println("ERROR");
				return new ModelAndView("log");
			}

			try {

				webservice.Servicio_scriptServiceStub oStub = new webservice.Servicio_scriptServiceStub();
				
				String text= texto.getTexto();
				
				webservice.Servicio_scriptServiceStub.Encriptar encript = new webservice.Servicio_scriptServiceStub.Encriptar();
				
				encript.setToken(token);
				encript.setCadena(text);
			
				
				EncriptarResponse objResponse = oStub.encriptar(encript);
				
			
				String mensaje = objResponse.get_return();

				return new ModelAndView("mensaje", "message", mensaje);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();

				return new ModelAndView("mensaje", "message", "ERROR");
			}

		}

		// menu para ingresar datos para administrador
		@RequestMapping("/desencriptar")
		public ModelAndView desencriptar() {

			return new ModelAndView("desencriptarTexto", "command",
					new Encriptacion());
		}

		/**
		 * Desencriptar texto.
		 *
		 * @param texto the texto
		 * @param result the result
		 * @param session the session
		 * @return the model and view
		 */
		@RequestMapping(value = "/desencriptarTexto", method = RequestMethod.POST)
		public ModelAndView desencriptarTexto(@ModelAttribute("Administrador") @Valid Encriptacion texto, BindingResult result,  HttpSession session) {

			String token = (String) session.getAttribute("token");

			if(token != null){

				if (result.hasErrors()) {
					System.out.println("ERROR");
					return new ModelAndView("menu");
				}

				try {

					webservice.Servicio_scriptServiceStub oStub = new webservice.Servicio_scriptServiceStub();

					webservice.Servicio_scriptServiceStub.ValidarLogin oValidarLogin = new webservice.Servicio_scriptServiceStub.ValidarLogin();
					oValidarLogin.setToken(token);

					webservice.Servicio_scriptServiceStub.ValidarLoginResponse loginResponse = oStub.validarLogin(oValidarLogin);
					String validaLogin = loginResponse.get_return();

					if(validaLogin.equals("Invalido")){
						System.out.println("Token invalido");
						return new ModelAndView("login", "command", new Usuario());
					}

					webservice.Servicio_scriptServiceStub.Desencriptar oDesencriptar = new webservice.Servicio_scriptServiceStub.Desencriptar();
					oDesencriptar.setCadena(texto.getTexto());
					oDesencriptar.setToken(token);
					

					webservice.Servicio_scriptServiceStub.DesencriptarResponse objResponse = oStub.desencriptar(oDesencriptar);

					String mensaje = objResponse.get_return();
					
					if(mensaje.equals("Token Invalido")){
						System.out.println("Token invalido");
						return new ModelAndView("login", "command", new Usuario());
					} else {
						System.out.println(mensaje);
						return new ModelAndView("mensaje", "message", mensaje);
					}

				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();

					return new ModelAndView("mensaje", "message", "ERROR");
				}

			} else {
				return new ModelAndView("login", "command", new Usuario());
			}

		}
		
		
}